﻿/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */

#pragma once

#include <CubismFramework.hpp>
#include <Math/CubismMatrix44.hpp>
#include <Type/csmVector.hpp>

class Live2dModel;

/**
* @brief サンプルアプリケーションにおいてCubismModelを管理するクラス<br>
*         モデル生成と破棄、タップイベントの処理、モデル切り替えを行う。
*
*/
class Live2dModelManager
{

public:
    /**
    * @brief   クラスのインスタンス（シングルトン）を返す。<br>
    *           インスタンスが生成されていない場合は内部でインスタンを生成する。
    *
    * @return  クラスのインスタンス
    */
    static Live2dModelManager* GetInstance();

    /**
    * @brief   クラスのインスタンス（シングルトン）を解放する。
    *
    */
    static void ReleaseInstance();

    /**
    * @brief   現在のシーンで保持しているモデルを返す
    *
    * @param[in]   no  モデルリストのインデックス値
    * @return      モデルのインスタンスを返す。インデックス値が範囲外の場合はNULLを返す。
    */
    Live2dModel* GetModel(Csm::csmUint32 no) const;

    /**
    * @brief   現在のシーンで保持しているすべてのモデルを解放する
    *
    */
    void ReleaseAllModel();

    /**
    * @brief   画面をドラッグしたときの処理
    *
    * @param[in]   x   画面のX座標
    * @param[in]   y   画面のY座標
    */
    void OnMove(Csm::csmFloat32 x, Csm::csmFloat32 y) const;

    /*
    * 鼠标点击
    */
    void OnClick(Csm::csmInt32 key,Csm::csmBool key_up) const;

    /*
    * 键盘点击
    */
    void OnLeftHandDown(Csm::csmBool key_up) const;

    /*
    * 键盘点击
    */
    void OnRightHandDown(Csm::csmBool key_up) const;

    /****************************JoyStick*********************************/

    void OnStickLeftDown(const Csm::csmBool key_up);

    void OnStickRightDown(const Csm::csmBool key_up);

    void OnStickShowLeftHand(const Csm::csmBool key_up);

    void OnStickShowRightHand(const Csm::csmBool key_up);

    void OnStickL(const Csm::csmFloat32 x, const Csm::csmFloat32 y);

    void OnStickR(const Csm::csmFloat32 x, const Csm::csmFloat32 y);

    /****************************JoyStick End*********************************/

    void StartMotion(const Csm::csmChar* group, const Csm::csmInt32 id);

    void SetExpression(const Csm::csmChar* expressionId);

    void SetExpressionById(const Csm::csmInt32 expressionId);

    void SetSpeed(const Csm::csmFloat32 speed);

    void SetRandomMotion(const Csm::csmBool _randomMotion, const Csm::csmBool _randomExpression);

    /**
    * @brief   画面を更新するときの処理
    *          モデルの更新処理および描画処理を行う
    */
    void OnUpdate() const;

    /**
    * @brief   シーンを切り替える<br>
    *           サンプルアプリケーションではモデルセットの切り替えを行う。
    */
    bool ChangeScene(const Csm::csmChar* dir, const Csm::csmChar* fileName);

    void ReleaseScene();

    /**
     * @brief   モデル個数を得る
     * @return  所持モデル個数
     */
    Csm::csmUint32 GetModelNum() const;

private:
    /**
    * @brief  コンストラクタ
    */
    Live2dModelManager();

    /**
    * @brief  デストラクタ
    */
    virtual ~Live2dModelManager();

    Csm::csmVector<Live2dModel*>  _models; ///< モデルインスタンスのコンテナ
};
